#include "JuegoClientImp.h"
#include <iostream>
#include <sstream>
using namespace std;

JuegoClientImp::JuegoClientImp(unsigned int cantidadDeJugadores, Mapa* mapa, Cliente* cliente) : Juego(cantidadDeJugadores,mapa)
{
	this->cliente = cliente;
	this->estado = "EstadoDeEsperaDeJugadores";
}

void JuegoClientImp::tirarDados(Jugador* jugador, unsigned int cantidadDeDados) {
	std::stringstream dados;
	dados<<cantidadDeDados;
	string mensaje = "<jugada>\n";
	mensaje += "	<tirarDados jugador=\""+jugador->getColor()+"\" cantidad=\""+dados.str()+"\"/>\n";
	mensaje += "</jugada>";
	cliente->enviarMensaje(mensaje);
}

void JuegoClientImp::pasar(Jugador* jugador) {
	string mensaje = "<jugada>\n";
	mensaje += "	<pasar jugador=\""+jugador->getColor()+"\"/>\n";
	mensaje += "</jugada>";
	cliente->enviarMensaje(mensaje);
}

void JuegoClientImp::realizarAtaque(Ataque* ataque) {
	std::stringstream ejercitos;
	ejercitos<<ataque->getCantidadDeDadosParaAtacar();
	string mensaje = "<jugada>\n";
	mensaje += "	<realizarAtaque jugador=\""+ataque->getJugadorAtacante()->getColor()+"\"";
	mensaje += " territorioAtacante=\""+ataque->getTerritorioAtacante()->getNombre()+"\"";
	mensaje += " territorioEnemigo=\""+ataque->getTerritorioEnemigo()->getNombre()+"\"";
	mensaje += " cantidadDeEjercitos=\""+ejercitos.str()+"\"/>\n";
	mensaje += "</jugada>\n";
	cliente->enviarMensaje(mensaje);
}

void JuegoClientImp::colocarEjercitos(Jugador *jugador, Territorio *territorio, unsigned int cantidadDeEjercitos) {
	string mensaje = "<jugada>\n";
	std::stringstream ejercitos;
	ejercitos<<cantidadDeEjercitos;
	mensaje += "	<colocarEjercitos jugador=\""+jugador->getColor()+"\"";
	mensaje += " territorio=\""+territorio->getNombre()+"\"";
	mensaje += " cantidad=\""+ejercitos.str()+"\"/>\n";
	mensaje += "</jugada>\n";
	cliente->enviarMensaje(mensaje);
}

void JuegoClientImp::moverEjercitos(Jugador* jugador, Territorio* origen, Territorio* destino, unsigned int cantidadDeEjercitos) {
	string mensaje = "<jugada>\n";
	std::stringstream ejercitos;
	ejercitos<<cantidadDeEjercitos;
	mensaje += "	<moverEjercitos jugador=\""+jugador->getColor()+"\"";
	mensaje += " origen=\""+origen->getNombre()+"\"";
	mensaje += " destino=\""+destino->getNombre()+"\"";
	mensaje += " cantidad=\""+ejercitos.str()+"\"/>\n";
	mensaje += "</jugada>\n";
	cliente->enviarMensaje(mensaje);
}

void JuegoClientImp::abandonar(Jugador* jugador) {
	string mensaje = "<jugada>\n";
	mensaje += "	<abandonar jugador=\""+jugador->getColor()+"\"/>\n";
	mensaje += "</jugada>\n";
	cliente->enviarMensaje(mensaje);
}

Cliente* JuegoClientImp::getCliente() {
	return this->cliente;
}

void JuegoClientImp::setTurno(string colorJugador) {
	control_Mutex.lock();
	Juego::setTurno(colorJugador);
	control_Mutex.unlock();
	notifyObservers();
}

void JuegoClientImp::setEstado(string estadoJuego) {
	control_Mutex.lock();
	this->estado = estadoJuego;
	control_Mutex.unlock();
	if (isEnEstadoDePartidaFinalizada())
		notifyObservers();
}

string JuegoClientImp::getEstado() {
	return this->estado;
}

bool JuegoClientImp :: isEnEstadoDePreparacion() {
	return (estado == "EstadoDePreparacionDePartida"); 
}

bool JuegoClientImp :: isEstadoDeRefuerzoYReubicacion() {
	return (estado == "EstadoDeRefuerzoYReubicacion"); 
}

bool JuegoClientImp :: isEnEstadoDeAtaque(){
	return (estado == "EstadoDeAtaque");
}

bool JuegoClientImp :: isEnEstadoDeFortificacionDeUnidades(){
	return (estado == "EstadoDeFortificacionDeUnidades");
}

bool JuegoClientImp::isEnEstadoDePartidaFinalizada() {
	return (estado == "EstadoDePartidaFinalizada");
}

bool JuegoClientImp::isEnEstadoDeEsperaDeJugadores() {
	return (estado == "EstadoDeEsperaDeJugadores");
}

JuegoClientImp::~JuegoClientImp()
{
}
